var cluster =require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
console.log('cluster.isMaster',cluster.isMaster);
if (cluster.isMaster) {
	//在一个主进程里，可以使用cluster.workers来获取Worker对象。
     console.log(`主进程 ${process.pid} 正在运行`);

    // 衍生工作进程。
    for (var i = 0; i < numCPUs; i++) {
        cluster.fork().on('online',function(e){
        	console.log('worker online',e)
        }).on('message',function(data){//这里绑定的是工作进程的message
        	console.log('worker message:'+data.msg)

        })
    }

    //当一个工作进程调用listen()后，工作进程上的server会触发'listening' 事件，同时主进程上的 cluster 也会被触发'listening'事件。
    //worker:工作进程对象 address:包含了以下连接属性： address、port 和 addressType
    cluster.on('listening',function(worker,address){
    	worker.send('工作进程发出的消息')
        console.log('listening: worker ' + worker.process.pid +', Address: '+address.address+":"+address.port);
    });
    //当新建一个工作进程后，工作进程应当响应一个online消息给主进程
    cluster.on('online',function(worker,data){
    	console.log('online',data)
    })
    //主进程接收任意工作进程发送的的消息
    cluster.on('message',function(worker,data,handle){
    	console.log('master msg:'+data.msg)
    })	
    cluster.on('exit', function(worker, code, signal) {
        console.log('worker ' + worker.process.pid + ' died',code,signal);
        cluster.fork();
    });
    console.log('master end')
} else {
	//在一个工作进程里，可以使用cluster.worker来获取Worker对象。
	// 工作进程可以共享任何 TCP 连接。
    // 在本例子中，共享的是一个 HTTP 服务器。
    console.log('worker start')
    http.createServer(function(req, res) {
        res.writeHead(200);
        res.end(cluster.worker.id+"-hello world\n"+process.pid);
        //通知进程
        process.send({msg:'url='+req.url+',id='+cluster.worker.id+',pid='+process.pid})
        process.disconnect();
    }).listen(8000);
     console.log(`工作进程 ${process.pid} 已启动${cluster.worker.id}`);
     process.on('message',function(data){
     	console.log(data,process.pid)
    })
}